package com.infocollect.project.api.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.infocollect.project.api.entity.TappFromEntity;
import com.infocollect.project.api.req.ConfigQueryJsonReq;
import com.infocollect.project.api.req.CustQueryFormReq;
import com.infocollect.project.api.vo.AuditOperatorVo;
import org.springframework.transaction.annotation.Transactional;
import com.infocollect.project.form.vo.R;
import net.sf.json.JSONObject;

import java.util.List;
import java.util.Map;

/**
 * (TappFrom)表服务接口
 *
 * @author makejava
 * @since 2019-12-25 10:32:29
 */
public interface ITappFromService extends IService<TappFromEntity> {

    /**
     * 通过ID查询单条数据
     *
     * @param fid 主键
     * @return 实例对象
     */
    TappFromEntity queryById(Long fid);

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    List<TappFromEntity> queryAllByLimit(int offset, int limit);

    /**
     * 查询所有在报名的项目
     *
     * @return 对象列表
     */
    List<TappFromEntity> queryAllByIsUse();

    /**
     * 新增数据
     *
     * @param tappFrom 实例对象
     * @return 实例对象
     */
    TappFromEntity insert(TappFromEntity tappFrom);

    /**
     * 修改数据
     *
     * @param tappFrom 实例对象
     * @return 实例对象
     */
    TappFromEntity update(TappFromEntity tappFrom);

    /**
     * 通过主键删除数据
     *
     * @param fid 主键
     * @return 是否成功
     */
    boolean deleteById(Long fid);

    /**
     * 查询多条数据
     *
     * @return 对象列表
     * @menu 根据实体对象是否有值 进行查询
     */
    List<TappFromEntity> queryAll(TappFromEntity entity);

    /**
     * 返回表单设计字段
     *
     * @param fid
     * @return
     */
    String GetFromDesignJson(Long fid);


    /**
     * @param tappFrom
     * @return
     */
    List<TappFromEntity> querypageList(TappFromEntity tappFrom);
     /**
     * 保存设置查询条件
     * @return
     */
    boolean saveConfigQueryJson(ConfigQueryJsonReq param);

    /**
     * 获取查询条件的配置
     * @param fid
     * @return
     */
    String getConfigQueryJson(Long fid);
    /**
     * 根据openId查项目数据id
     * @param tableName,openId
     * @return
     */
    Long getFromFidByOpenId(CustQueryFormReq custQueryFormReq);
    /**
     * 根据证件号码查项目数据id
     * @param tableName,IDFiledName,IDFiledValue
     * @return
     */
    Long getFromFidByIDNum(CustQueryFormReq custQueryFormReq);
    /**
     * 根据openId查项目数据id
     * @param strTableName
     * @return
     */
    TappFromEntity querybyTableName(String strTableName);


    void updateTestA();
    void updateTestB();
    /**
     * @author dongpj
     * @date 2022/5/2 11:04
     * @param
     * formId 具体哪个表单项目
     * updateSupport 是否覆盖，永远以证件号码中文匹配这个字段
     * @return
     * @describe 导入项目数据
     */
    List<JSONObject> getImportData(List<Map<String,Object>> dataList, Long formId, boolean updateSupport);
    /**
     * @author dongpj
     * @date 2022/5/2 18:32
     * @param
     * @return
     * @describe 审核
     */
    R<String> auditOperator(AuditOperatorVo param);
    /**
     * @author dongpj
     * @date 2022/8/27 10:32
     * @param userId, username
     * @return com.infocollect.project.form.vo.R<java.lang.String>
     * @describe 随机提取10条记录，更新到当前用户下面
     */
    R<String> extractAuditData(String userId,String userName,String fromTableName);
    /**
     * @author dongpj
     * @date 2022/8/27 10:32
     * @param userId, username
     * @return com.infocollect.project.form.vo.R<java.lang.String>
     * @describe 随机提取1条记录，更新到当前用户下面，并返回数据id，如果当用户下面还有记录，直接返回
     */
    R<String> lockAuditData(String userId, String username,String fromTableName);
    /**
     * @author dongpj
     * @date 2022/8/27 10:32
     * @param userId, username
     * @return com.infocollect.project.form.vo.R<java.lang.String>
     * @describe 锁定一条指定的记录
     */
    R<String> lockRecord(String userId, String username,JSONObject param);
    /**
     * @author dongpj
     * @date 2022/8/27 10:46
     * @param
     * @return
     * @describe 释放指定人员已提取的数据
     */
    R<String> unExtractAuditData(String userId,String userName,String fromTableName);
    /**
     * @author dongpj
     * @date 2022/8/27 10:56
     * @param fromTableName, Fid
     * @return com.infocollect.project.form.vo.R<java.lang.String>
     * @describe 释放指定记录
     */
    R<String>   unExtractFidAuditData(String fromTableName,String fid);
    /**
     * @author dongpj
     * @date 2022/8/27 11:13
     * @param userId, fromTableName
     * @return com.infocollect.project.form.vo.R<java.lang.String>
     * @describe 获取待审核的下一条记录
     */
    R<String> getNextAuditData(String userId,String fromTableName);
}
